home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 283_01 / cvideo.c < prev    next >
C/C++ Source or Header  |  1988-12-15  |  6KB  |  202 lines

  1.  
  2. /* CVIDEO.C - after Microsoft Systems Journal, Nov. 1988, pp. 3-4 */
  3.  
  4. #include "video.h"
  5. #include <stdlib.h>
  6. #include <malloc.h>
  7. #include <dos.h>
  8.  
  9.  
  10. /* Considerations:  The original CVIDEO.C included calls to int86()
  11.                     indiscriminately in places other than GetVideoParms().
  12.                     This destroys the generality of the algorithm, by
  13.                     making it impossible to write to a general buffer
  14.                     other than the physical screen buffer, by forcing
  15.                     some CVIDEO routines to call ROM BIOS.
  16.  
  17.                     What I've done is to add a couple of service routines
  18.                     to ASMVIDEO.ASM, and remove all int86()'s from this
  19.                     and my own libraries, with the exception of routines
  20.                     which read or update the physical cursor location, or
  21.                     which initialize the module.
  22.  
  23.                     See additional opinions in VIDEO.H.
  24.  
  25.                     12/10/88, d.c.oshel
  26.                     */
  27.  
  28. struct MSJ_VideoInfo video = { 0 };
  29.  
  30. static union REGS inregs, outregs;
  31. static int i, j, n, sz, sza;
  32. static char far * p;
  33. static char * q;
  34.  
  35. /* Functions */
  36.  
  37. /*-------------------------------------------------------------*/
  38. /* MSJ_GetVideoParms()  fills a struct MSJ_VideoInfo with data */
  39. /*-------------------------------------------------------------*/
  40.  
  41. void MSJ_GetVideoParms( struct MSJ_VideoInfo * sptr)
  42. {
  43.     char far *CrtMode    = (char far *) 0x00400049;
  44.     char far *CrtCols    = (char far *) 0x0040004A;
  45.     int  far *CrtStart   = (int  far *) 0x0040004E;
  46.     int  far *CrtAddr    = (int  far *) 0x00400063;
  47.     char far *CrtRows    = (char far *) 0x00400084;
  48.     char far *CrtEgaInfo = (char far *) 0x00400087;
  49.  
  50.     /* -- synchronize video writes? -- */
  51.  
  52.     inregs.h.ah = 0x12;
  53.     inregs.h.bl = 0x10;
  54.     int86( 0x10, &inregs, &outregs );
  55.     if ( outregs.h.bl == 0x10 )
  56.     {
  57.         if ( *CrtAddr == 0x3D4 )
  58.             sptr->SnowFlag = 1;
  59.         else
  60.             sptr->SnowFlag = 0;
  61.         sptr->rows = 25;
  62.     }
  63.     else
  64.     {
  65.         if ( (*CrtEgaInfo & 0x08) && (*CrtAddr == 0x3D4) )
  66.             sptr->SnowFlag = 1;
  67.         else
  68.             sptr->SnowFlag = 0;
  69.         sptr->rows = *CrtRows + 1;
  70.     }
  71.  
  72.  
  73.     /* -- color or monochrome? -- */
  74.  
  75.     if (*CrtAddr == 0x3D4)
  76.     {
  77.         sptr->ColorFlag = 1;
  78.         sptr->SegAddr = 0xB800;
  79.     }
  80.     else
  81.     {
  82.         sptr->ColorFlag = 0;
  83.         sptr->SegAddr = 0xB000;
  84.     }
  85.  
  86.     /* -- copy remaining parameters from BIOS -- */
  87.  
  88.     sptr->mode = *CrtMode;
  89.     sptr->columns = *CrtCols;
  90.     sptr->BufferStart = *CrtStart;
  91. }
  92.  
  93.  
  94.  
  95. /*----------------------------------------------*/
  96. /* MSJ_ClrScr()  clears the entire viewing area */
  97. /*----------------------------------------------*/
  98.  
  99. void MSJ_ClrScr( char VideoAttr, struct MSJ_VideoInfo *sptr )
  100. {
  101.     MSJ_SetFldAttr( ' ',0,0,VideoAttr,(sptr->rows * sptr->columns),sptr );
  102. }
  103.  
  104.  
  105.  
  106. /*-----------------------------------------------------*/
  107. /* MSJ_ClrRegion()  clears the specified screen region */
  108. /*-----------------------------------------------------*/
  109.  
  110. void MSJ_ClrRegion( char row1, char col1, char row2, char col2, char VideoAttr )
  111. {
  112.     for ( i = row1; i <= row2; i++ )
  113.         MSJ_SetFldAttr( ' ', i, col1, VideoAttr, col2-col1+1, &video );
  114. }
  115.  
  116.  
  117.  
  118. /*--------------------------------------------------------*/
  119. /* MSJ_TextBox()  draws a box around the specified region */
  120. /*--------------------------------------------------------*/
  121.  
  122. void MSJ_TextBox( char row1, char col1, char row2, char col2, char VideoAttr, struct MSJ_VideoInfo *sptr )
  123. {
  124.     MSJ_DispCharAttr( 0xDA, row1, col1, VideoAttr, sptr );
  125.     for ( i = col1 + 1; i < col2; i++ )
  126.         MSJ_DispCharAttr( 0xC4, row1, i, VideoAttr, sptr );
  127.     MSJ_DispCharAttr( 0xBF, row1, col2, VideoAttr, sptr );
  128.     for ( i = row1 + 1; i < row2; i++ )
  129.         MSJ_DispCharAttr( 0xB3, i, col2, VideoAttr, sptr );
  130.     MSJ_DispCharAttr( 0xD9, row2, col2, VideoAttr, sptr );
  131.     for ( i = col2 - 1; i > col1; i-- )
  132.         MSJ_DispCharAttr( 0xC4, row2, i, VideoAttr, sptr );
  133.     MSJ_DispCharAttr( 0xC0, row2, col1, VideoAttr, sptr );
  134.     for ( i = row2 - 1; i > row1; i-- )
  135.         MSJ_DispCharAttr( 0xB3, i, col1, VideoAttr, sptr );
  136. }
  137.  
  138.  
  139.  
  140. /*-------------------------------------------------------------------*/
  141. /* MSJ_SaveRegion()  saves the contents of a specified screen region */
  142. /*-------------------------------------------------------------------*/
  143.  
  144.  
  145. void MSJ_SaveRegion( char row1, char col1, 
  146.                      char row2, char col2, 
  147.                      int * ScreenBuffer, 
  148.                      struct MSJ_VideoInfo * sptr )
  149. {
  150.     /* this folderol is to provide memory-model independence, considering
  151.        both Prosise's prototype and my own primitives
  152.        */
  153.  
  154.     n = col2-col1+1;
  155.     sz = n * sizeof(int);
  156.     sza = (row2-row1+1) * sz;
  157.  
  158.     p = (char far *) _fmalloc( sza );
  159.     q = (char *) ScreenBuffer;
  160.  
  161.     for ( j = 0, i = row1; i <= row2; j++, i++ )
  162.         MSJ_MovScrBuf( p+(j*sz), i, col1, n, &video );
  163.  
  164.     for ( i = 0; i < sza; i++ )
  165.         *(q+i) = *(p+i);
  166.  
  167.     _ffree(p);
  168. }
  169.  
  170.  
  171. /*----------------------------------------------------------------------*/
  172. /* MSJ_RestRegion()  restores the contents of a specified screen region */
  173. /*----------------------------------------------------------------------*/
  174.  
  175. void MSJ_RestRegion( char row1, char col1, 
  176.                      char row2, char col2, 
  177.                      int * ScreenBuffer, 
  178.                      struct MSJ_VideoInfo * sptr )
  179. {
  180.     /* this folderol is to provide memory-model independence, considering
  181.        both Prosise's prototype and my own primitives
  182.        */
  183.  
  184.     n = col2-col1+1;
  185.     sz = n * sizeof(int);
  186.     sza = (row2-row1+1) * sz;
  187.  
  188.     p = (char far *) _fmalloc( sza );
  189.     q = (char *) ScreenBuffer;
  190.  
  191.     for ( i = 0; i < sza; i++ )
  192.         *(p+i) = *(q+i);
  193.  
  194.     for ( j = 0, i = row1; i <= row2; j++, i++ )
  195.         MSJ_MovBufScr( p+(j*sz), i, col1, n, &video );
  196.  
  197.     _ffree(p);
  198. }
  199.  
  200. /* eof */
  201.  
  202.